package com.scott.itcast.exchanger;

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 用白粉换手枪的例子Exchanger
 * 实现2个线程之间的数据交换。
 * 卖毒品的和买毒品的交换东西
 * 买毒品的先到了。怎么办? 等
 * 当卖毒品的到了后。怎么办? 2者迅速交换数据
 * 总结： 当且仅当2者都到了的时候才开始做事。只要有1个没到就一直等。
 */
public class ExchangerTest {

	public static void main(String[] args) {
		ExecutorService threadPool = Executors.newCachedThreadPool();
		final Exchanger<String> exchanger = new Exchanger<String>();
		
		//第1个线程
		threadPool.execute(new Runnable(){
			public void run() {
				try {				

					String data1 = "白粉";
					System.out.println("线程[" + Thread.currentThread().getName() + "]正在等待交易。自己拥有的东西为：[" + data1+"]");
					
					//在交易之前先休息一会。因为2个人休息的时间不同。所以肯定有1个线程先到达。另外1个线程后到达。
					Thread.sleep((long)(Math.random()*10000));
					
					String data2 = exchanger.exchange(data1);
					System.out.println("线程[" + Thread.currentThread().getName() + "]换回的东西为:[" + data2+"]");
				}catch(Exception e){
					
				}
			}	
		});
		
		//第2个线程
		threadPool.execute(new Runnable(){
			public void run() {
				try {				

					String data1 = "手枪";
					System.out.println("线程[" + Thread.currentThread().getName() + "]正在等待交易。自己拥有的东西为：[" + data1+"]");
					Thread.sleep((long)(Math.random()*10000));					
					String data2 = exchanger.exchange(data1);
					System.out.println("线程[" + Thread.currentThread().getName() + "]换回的东西为：[" + data2+"]");
				}catch(Exception e){
					
				}				
			}	
		});		
	}
}
